<?php

/**
 * Dat@ctiv Framework
 *
 * @author		Mathieu Rey
 * @copyright	Copyright (c) 2008, datactiv.fr
 * @link		http://www.datactiv.fr
 */

/**
 * Sessions
 *
 * Contrôle d'accès, gestion des sessions
 *
 * @author		Mathieu Rey
 */


// ------------------
/*
error_reporting("E^ALL");
set_error_handler('_exception_handler');

function _exception_handler($severity, $message, $filepath, $line){
	echo "<br /><b>".$severity." : </b> ".$message." (fichier : ".$filepath.", ligne : ".$line.")<br /><br />";
}
*/
// ------------------


class Sessions{

	private $erreur = "";

	private $cookie_name = "exosmaths_";		// Nom du cookie de session
	private $timeout = 6000;						// Timeout (en secondes) -> 1 h 40 ici

	private $groupe = 0;
	private $nomprenom = "";
	private $UID = 0;
	

	function __construct(){


	}



	function cookieset($nom, $val){
		setcookie($nom, $val); // Pas de durée = cookie de session
	}

	function cookieunset($nom){
		setcookie($nom, "", time()-3600); // Pose un cookie périmé
	}

	/**
	 * session_open
	 *
	 * Crée la session de l'utilisateur (pas de vérification de l'autorisation)
	 */
	function session_open($infos){

		$s = array();
		
		// Crée un UID et un nom de session, definit le timeout
		$uid = md5("dùz$^gf^gf$(-$^èç_à*$".time()."5dù*-(è_çà_mùdw".microtime()."f$^^*^ù*ù)àààs");
		$timeout = time() + $this->timeout;

		$nomsession = $this->cookie_name.substr(md5($uid), 3, 4);

		// On conserve le useragent et l'adresse IP
		$s["useragent"] = substr($_SERVER["HTTP_USER_AGENT"], 0, 32);
		$s["ip"] = $_SERVER["REMOTE_ADDR"];

		// On intègre les données passées au script
		$s = array_merge($s, $infos);

		// Insertion dans la base
		$b =& load("sql");
		$b->insert("sessions", array(
			"nom1" => $nomsession,
			"nom2" => $uid,
			"timeout" => $timeout,
			"data" => $s));

		// On pose le cookie
		$this->cookieset($nomsession, $uid);
		$_COOKIE[$nomsession] = $uid;

	}



	/**
	 * session_close
	 *
	 * Termine la session de l'utilisaeur
	 */
	function session_close(){

		$s = &load("sql");

		// On supprime tous les cookies, et leur correspondance dans la base de données
		foreach ($_COOKIE as $nomsession => $uid){
			$this->cookieunset($nomsession);
			$s->delete("sessions", array("nom2" => $uid, "nom1" => $nomsession));
		}

		GLOBAL $URLBASE;
		header("Location: ".$URLBASE);
	}

	/**
	 * restreint
	 *
	 * Crée la session de l'utilisaeur si tout est correct
	 */
	function restreint($lrequis){

		if ($this->groupe < $lrequis){

			erreur("error", "Sessions", "Vous n'avez pas l'autorisation d'accèder à cette partie !");
			exit;
		}

	}

	function getgroupe(){
		return $this->groupe;
	}

	function getnomprenom(){
		return $this->nomprenom;
	}

	function getUID(){
		return $this->UID;
	}

	/**
	 * verifiersession
	 *
	 * Fonction qui vérifie la validité de la session en cours
	 */
	function verifiersession(){

		// Regarde les cookies présents
		$i = 0;
		$cookie = array();

		foreach ($_COOKIE as $ligne => $valeur){
			$cookie["nom"] = $ligne;
			$cookie["clef"] = $valeur;
			$i++;
		}

		// Plus d'un cookie : on efface tout
		if ($i > 1){
			foreach ($_COOKIE as $ligne => $valeur){
				$this->cookieunset($ligne);
			}
			afficher("connexion");
			exit;
		}

		// Pas de cookie
		if ($i == 0){
			afficher("connexion");
			exit;
		}

		// On n'a qu'un seul cookie, on regarde dans la base
		$s =& load("sql");
		$s->select("*", "sessions", array("nom2" => $cookie["clef"], "nom1" => $cookie["nom"]));
		
		if ($s->num_rows() == 0){
			// Pas de session correspondante
			$this->cookieunset($cookie["nom"]);
			afficher("connexion", "Session inconnue ! Veuillez vous connecter à nouveau.");
			exit;
		}

		$r = $s->fetch_object();

		if ($r->timeout < time()){
			// timeout
			$this->cookieunset($cookie["nom"]);
			afficher("connexion", "Votre session est expirée ! Veuillez vous connecter à nouveau.");
			exit;
		}

		if (substr($_SERVER["HTTP_USER_AGENT"], 0, 32) != $r->data["useragent"] || $_SERVER["REMOTE_ADDR"] != $r->data["ip"]){
			// truc bizarre (changement ip ou browser)
			$this->cookieunset($cookie["nom"]);
			afficher("connexion", "L'application a rencontré un problème. Veuillez vous connecter à nouveau.");
			exit;
		}

		// Garbage Collector : on supprime les vieilles sessions
		$s->delete("sessions", "timeout < '".time()."'");

		// Met à jour le timeout de l'utilisateur
		$timeout = time() + $this->timeout;
		$s->update("sessions", array("timeout" => $timeout),  array("nom2" => $cookie["clef"], "nom1" => $cookie["nom"]));

		$this->nomprenom = $r->data["nomprenom"];
		$this->groupe = $r->data["groupe"];
		$this->UID = $r->data["UID"];


	}


	/**
	 * verifierdonneesconnexion
	 *
	 * Vérifie les informations saisies et définit si tout est correct
	 */
	function verifierdonneesconnexion(){

		$login = $_POST["login"];
		$pass = md5($_POST["pass"]);

		// Regarde dans la BDD
		$b =& load("sql");
		$b -> select(array("uti_groupe", "uti_nomprenom", "uti_UID"), "utilisateur", array("uti_login" => $login, "uti_pass"=> $pass));
		
		if ($b->num_rows() == 0){	
			// Pas de réponse
			afficher("connexion", "Utilisateur inconnu !");
			exit;
		}
		$r = $b->fetch_object();

		// Là c'est bon, on ouvre la session
		$this->session_open(array("groupe" => $r->uti_groupe, "nomprenom" => $r->uti_nomprenom, "UID" => $r->uti_UID));

		GLOBAL $URLBASE;
		header("Location: ".$URLBASE);

	}


}


?>